package com.itany.corejava.code08_常用类.string类;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * @author 石小俊
 * 2024年07月22日 9:57
 */
public class Test07_字符集 {

    public static void main(String[] args) throws UnsupportedEncodingException {
        //encoding();
        //decoding();
        //garbled();
        garbled2();
    }

    public static void showEncoding() {
        System.out.println("当前系统搜使用的字符集:" + System.getProperty("file.encoding"));
        System.out.println("当前JVM默认字符集为:" + Charset.defaultCharset());
    }

    /**
     * 编码
     * @throws UnsupportedEncodingException
     */
    public static void encoding() throws UnsupportedEncodingException {
        String s = "你好";
        // 对于GBK编码,每个中文占2个字节
        byte[] bs = s.getBytes("GBK");
        // [-60, -29, -70, -61]
        System.out.println(Arrays.toString(bs));
        // 对于UTF-8编码,每个中文占3个字节
        // 当前系统默认字符集为:UTF-8
        byte[] bs2 = s.getBytes();
        // [-28, -67, -96, -27, -91, -67]
        System.out.println(Arrays.toString(bs2));
    }

    /**
     * 解码
     */
    public static void decoding() throws UnsupportedEncodingException {
        byte[] bs = {-60, -29, -70, -61};
        String s = new String(bs, "GBK");
        System.out.println(s);

        byte[] bs2 = {-28, -67, -96, -27, -91, -67};
        String s2 = new String(bs2);
        System.out.println(s2);
    }

    /**
     * 乱码
     */
    public static void garbled() throws UnsupportedEncodingException {
        String s = "你好";
        // 编码 --> 使用GBK编码
        byte[] bs = s.getBytes("GBK");
        System.out.println(Arrays.toString(bs));

        // 解码 --> 使用ISO-8859-1解码
        String s2 = new String(bs, "ISO-8859-1");
        // 此时由于编码与解码所使用的字符集不一致,因此产生了乱码
        System.out.println(s2);

        // 乱码解决方式:对乱码的字符串重新进行编码与解码
        // 此时编码与解码要与乱码前使用的解码与编码的字符集一致
        // 编码 --> 使用之前解码的字符集
        byte[] bs2 = s2.getBytes("ISO-8859-1");
        // 解码 --> 使用乱码时的编码字符集
        String s3 = new String(bs2, "GBK");
        System.out.println(s3);

        // 简写方式
        String s4 = new String(s2.getBytes("ISO-8859-1"), "GBK");
        System.out.println(s4);
    }

    /**
     * 由于每个字符集包含的字符范围不一致,因此可能存在无法解决的场景
     * 例如:GBK是不符合UTF-8的规则
     */
    public static void garbled2() throws UnsupportedEncodingException {
        String s = "你好";
        // 编码 --> 使用GBK编码
        byte[] bs = s.getBytes("GBK");
        System.out.println(Arrays.toString(bs));

        // 解码 --> 使用UTF-8解码
        String s2 = new String(bs, "UTF-8");
        System.out.println(s2);

        String s3 = new String(s2.getBytes("ISO-8859-1"), "GBK");
        System.out.println(s3);
    }

}
